--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/frontend/MarkdownRenderer.test.js ee9ed05338feee2e71aa3c839fd716c9a6bc2315 (ee9ed053) Text, 9.50 KB
Tff7b72import Tb4b4b4{ Te6edf3describeTb4b4b4, Te6edf3itTb4b4b4, Te6edf3expect Tb4b4b4} Tff7b72from Ta5d6ff"vitest"Tb4b4b4;
Tff7b72import Te6edf3MarkdownRenderer Tff7b72from Ta5d6ff"@/js/MarkdownRenderer"Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"MarkdownRenderer.js"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3describeTb4b4b4(Ta5d6ff"render"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"renders basic text correctly"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Ta5d6ff"Hello"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Hello"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"renders bold text correctly"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Ta5d6ff"**Bold**"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<strong>Bold</strong>"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"renders italic text correctly"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Ta5d6ff"*Italic*"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<em>Italic</em>"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"renders bold and italic text correctly"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Ta5d6ff"***Bold and Italic***"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<strong><em>Bold and Italic</em></strong>"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"renders headers correctly"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Ta5d6ff"# Header 1"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<h1"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Ta5d6ff"## Header 2"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<h2"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Ta5d6ff"### Header 3"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<h3"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"renders inline code correctly"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Ta5d6ff"`code`"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<code"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"code"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"renders fenced code blocks correctly"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Ta5d6ff"```python\nprint('hello')\n```"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<pre"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<code"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"language-python"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"print('hello')"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles paragraphs correctly"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Ta5d6ff"Para 1\n\nPara 2"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<p"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Para 1"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Para 2"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"security: XSS prevention"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"escapes script tags"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3malformed Tff7b72= Ta5d6ff"<script>alert('xss')</script>"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3malformedTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<script>"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<script>"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"escapes onerror attributes in images"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3malformed Tff7b72= Ta5d6ff'<img src="x" onerror="alert(1)">'Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3malformedTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<img"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<img"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"onerror="alert(1)""Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"escapes html in code blocks"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3malformed Tff7b72= Ta5d6ff"```\n<script>alert(1)</script>\n```"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3malformedTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<script>"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"escapes html in inline code"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3malformed Tff7b72= Ta5d6ff"`<script>alert(1)</script>`"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3malformedTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<script>"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"reticulum links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"detects nomadnet:// links with hash and path"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"check this out: nomadnet://1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"nomadnet://1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects bare hash and path links as nomadnet"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"node is at 1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects nomadnet:// links with just hash"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"nomadnet://1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects bare hash as lxmf link"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"send to 1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="lxmf-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-lxmf-address="1dfeb0d794963579bd21ac8f153c77a4"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"does not detect invalid hashes"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"not-a-hash:/page/index.mu"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"nomadnet-link"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"lxmf-link"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"fuzzing: stability testing"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3generateRandomString Tff7b72= Tb4b4b4(Te6edf3lengthTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3chars Tff7b72=
Ta5d6ff"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=[]{}|;':\",./<>?`~ \n\r\t"Tb4b4b4;
Tff7b72let Te6edf3result Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3result Tff7b72+= Te6edf3charsTb4b4b4.Te6edf3charAtTb4b4b4(Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657MathTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4) Tff7b72* Te6edf3charsTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles random inputs without crashing (100 iterations)"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff100Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3randomText Tff7b72= Te6edf3generateRandomStringTb4b4b4(Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657MathTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3randomTextTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles deeply nested or complex markdown patterns without crashing"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3complex Tff7b72= Ta5d6ff"# "Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff100Tb4b4b4) Tff7b72+ Ta5d6ff"**"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff100Tb4b4b4) Tff7b72+ Ta5d6ff"```"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff100Tb4b4b4) Tff7b72+ Ta5d6ff"```\n"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3complexTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles large inputs correctly (1MB of random text)"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3largeText Tff7b72= Te6edf3generateRandomStringTb4b4b4(T79c0ff1024 Tff7b72* T79c0ff1024Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3start Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3largeTextTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3end Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72typeof Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"string"Tb4b4b4)Tb4b4b4;
T8b949e// performance check: should be relatively fast (less than 500ms for 1MB usually)
Te6edf3expectTb4b4b4(Te6edf3end Tff7b72- Te6edf3startTb4b4b4)Tb4b4b4.Te6edf3toBeLessThanTb4b4b4(T79c0ff1000Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles potential ReDoS patterns (repeated separators)"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
T8b949e// Test patterns that often cause ReDoS in poorly written markdown parsers (can never be too careful, especially on public testnets)
Tff7b72const Te6edf3redosPatterns Tff7b72= Tb4b4b4[
Ta5d6ff"*"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff10000Tb4b4b4)Tb4b4b4, T8b949e// Long string of bold markers
Ta5d6ff"#"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff10000Tb4b4b4)Tb4b4b4, T8b949e// Long string of header markers
Ta5d6ff"`"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff10000Tb4b4b4)Tb4b4b4, T8b949e// Long string of backticks
Ta5d6ff" "Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff10000Tb4b4b4) Tff7b72+ Ta5d6ff"\n"Tb4b4b4, T8b949e// Long string of whitespace
Ta5d6ff"[]("Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff5000Tb4b4b4)Tb4b4b4, T8b949e// Unclosed links (if we added them)
Ta5d6ff"** "Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff5000Tb4b4b4)Tb4b4b4, T8b949e// Bold marker followed by space repeated
Tb4b4b4]Tb4b4b4;
Te6edf3redosPatternsTb4b4b4.Te6edf3forEachTb4b4b4(Tb4b4b4(Te6edf3patternTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3start Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3patternTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3end Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3end Tff7b72- Te6edf3startTb4b4b4)Tb4b4b4.Te6edf3toBeLessThanTb4b4b4(T79c0ff100Tb4b4b4)Tb4b4b4; T8b949e// Should be very fast
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles unicode homoglyphs and special characters without interference"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3homoglyphs Tff7b72= Tb4b4b4[
Ta5d6ff"**bold**"Tb4b4b4,
Ta5d6ff"∗∗notbold∗∗"Tb4b4b4, T8b949e// unicode asterisks
Ta5d6ff"# header"Tb4b4b4,
Ta5d6ff"# not header"Tb4b4b4, T8b949e// fullwidth hash
Ta5d6ff"`code`"Tb4b4b4,
Ta5d6ff"`notcode`"Tb4b4b4, T8b949e// fullwidth backtick
Tb4b4b4]Tb4b4b4;
Te6edf3homoglyphsTb4b4b4.Te6edf3forEachTb4b4b4(Tb4b4b4(Te6edf3textTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tff7b72typeof Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff"string"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles malformed or unclosed markdown tags gracefully"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3malformed Tff7b72= Tb4b4b4[
Ta5d6ff"**bold"Tb4b4b4,
Ta5d6ff"```python\nprint(1)"Tb4b4b4,
Ta5d6ff"#header"Tb4b4b4, T8b949e// no space
Ta5d6ff"`code"Tb4b4b4,
Ta5d6ff"___triple"Tb4b4b4,
Ta5d6ff"**bold*italic**"Tb4b4b4,
Ta5d6ff"***bolditalic**"Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Te6edf3malformedTb4b4b4.Te6edf3forEachTb4b4b4(Tb4b4b4(Te6edf3textTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3MarkdownRendererTb4b4b4.Te6edf3renderTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"strip"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"strips markdown correctly"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3md Tff7b72= Ta5d6ff"# Header\n**Bold** *Italic* `code` ```\nblock\n```"Tb4b4b4;
Tff7b72const Te6edf3stripped Tff7b72= Te6edf3MarkdownRendererTb4b4b4.Te6edf3stripTb4b4b4(Te6edf3mdTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3strippedTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Header"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3strippedTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Bold"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3strippedTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Italic"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3strippedTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"code"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3strippedTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"[Code Block]"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3strippedTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"# "Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3strippedTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"**"Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3strippedTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"` "Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────